﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;

namespace Ultilities
{
    public partial class BaseForm : DevExpress.XtraEditors.XtraForm, IBaseForm
    {
        public BaseForm()
        {
            InitializeComponent();
            _currentTabpage = TabpageName.Category;
            _permission = new ErpPermission();
            _permission.CanAdd = _permission.CanEdit = true;
        }

        #region Variable

        public event StatusBarEventHandler StatusBarTextChanged;
        public event SelectedTabChangedEventHandler SelectedTabChanged;

        ErrorProvider errValid;

        private string _strFunctionKey;
        public virtual string FunctionKey
        {
            get { return _strFunctionKey; }
            set { _strFunctionKey = value; }
        }

        private string _strFunctionName;
        public virtual string FunctionName
        {
            get { return _strFunctionName; }
            set { _strFunctionName = value; }
        }

        private bool _AutoID = false;
        /// <summary>
        /// Thuoc tinh cho biet chuc nang nay co cho phep so tu dong hay khong.
        /// </summary>
        public bool AutoID
        {
            get { return _AutoID; }
            set { _AutoID = value; }
        }

        private int _MaxLengthID = 20;
        /// <summary>
        /// Maximum number of ID's character
        /// </summary>
        public int MaxLengthID
        {
            get { return _MaxLengthID; }
            set { _MaxLengthID = value; }
        }

        private bool _IsAutoRefresh = false;
        /// <summary>
        /// Thuoc tinh cho biet du lieu refresh tu dong hay do nguoi dung tac dong.
        /// </summary>
        public bool IsAutoRefresh
        {
            get { return _IsAutoRefresh; }
            set { _IsAutoRefresh = value; }
        }

        private FormStatus _status;
        public FormStatus StatusOfForm
        {
            get { return _status; }
            set { _status = value; }
        }

        private string _strStatusText;
        public string StatusText
        {
            set
            {
                try
                {
                    _strStatusText = value;
                    if (StatusBarTextChanged != null) //if form loading finish
                    {
                        StatusBarEventArgs args = new StatusBarEventArgs(_strStatusText);
                        StatusBarTextChanged(this, args);
                    }                    
                }
                catch (Exception)
                {
                }
            }

        }

        private ErpPermission _permission;
        public ErpPermission Permission
        {
            get
            {
                return _permission;
            }
            set
            {
                _permission = value;
            }
        }

        private TabpageName _currentTabpage;

        public TabpageName CurrentTabpage
        {
            set 
            {
                try
                {
                    _currentTabpage = value;
                    if (SelectedTabChanged != null)
                    {
                        if (value == TabpageName.Category)
                            SelectedTabChanged(this, tbCategory);
                        else
                            SelectedTabChanged(this, tbAction);
                    }
                }
                catch
                {
                }
            }
        }

        #endregion

        #region Toolbar

        public TOOLBAR tbCategory = new TOOLBAR();
        public TOOLBAR tbAction = new TOOLBAR();

        #endregion

        #region Support Methods

        public virtual TOOLBAR GetCurrentToolBar()
        {
            if (_currentTabpage == TabpageName.Action)
                return tbAction;
            else
                return tbCategory;
        }

        protected void SetToolbarButton(TabpageName tp, bool Add, bool Edit, bool Save, bool Delete, bool Print, bool Refresh)
        {
            switch (tp)
            {
                case TabpageName.Category:
                    tbCategory = new TOOLBAR
                    {
                        AllowAdd = Add,
                        AllowEdit = Edit,
                        AllowDelete = Delete,
                        AllowRefresh = Refresh,
                        AllowPrint = Print, 
                        AllowSave = Save
                    };
                    break;
                case TabpageName.Action:
                    tbAction = new TOOLBAR
                    {
                        AllowAdd = Add,
                        AllowEdit = Edit,
                        AllowDelete = Delete,
                        AllowRefresh = Refresh,
                        AllowPrint = Print,
                        AllowSave = Save
                    };
                    break;
            }

            //Form frm = Application.OpenForms["FrmMain"];
            //Control[] ctr = frm.Controls.Find("pnToolbar", true);
            //if (ctr.Length > 0)
            //{
            //    PanelControl pn = (PanelControl)ctr[0];
            //    switch (tpName)
            //    {
            //        case TabpageName.Category:
            //            {
            //                SetToolbarButtonForAction(tbCategory, pn);
            //            }
            //            break;
            //        case TabpageName.Action:
            //            {
            //                SetToolbarButtonForAction(tbAction, pn);
            //            }
            //            break;
            //    }
            //}
        }

        private void SetToolbarButtonForAction(TOOLBAR tb, PanelControl pn)
        {
            foreach (Control item in pn.Controls)
            {
                if (item.Name == TOOLBARNAME.btnAdd.ToString())
                {
                    item.Enabled = tb.AllowAdd;
                }
                else if (item.Name == TOOLBARNAME.btnDelete.ToString())
                {
                    item.Enabled = tb.AllowDelete;
                }
                else if (item.Name == TOOLBARNAME.btnEdit.ToString())
                {
                    item.Enabled = tb.AllowEdit;
                }
                else if (item.Name == TOOLBARNAME.btnPrint.ToString())
                {
                    item.Enabled = tb.AllowPrint;
                }
                else if (item.Name == TOOLBARNAME.btnRefresh.ToString())
                {
                    item.Enabled = tb.AllowRefresh;
                }
                else if (item.Name == TOOLBARNAME.btnSave.ToString())
                {
                    item.Enabled = tb.AllowSave;
                }
            }
        }

        #endregion

        protected void ActionOnControl(Control[] listControl, bool enable)
        {
            foreach (Control item in listControl)
            {
                item.Enabled = enable;
            }
        }

        #region Override Base Methods

        public virtual void fncInsert()
        {
            //TODO: Các lệnh tổng quát được xử lý khi bấm nút Add
        }

        public virtual void fncSave()
        {
            if (_status == FormStatus.Edit)
                _status = FormStatus.View;
            else if (_status == FormStatus.Add)
                _status = FormStatus.View;
        }

        public virtual void fncEdit()
        {
            //TODO: Các lệnh tổng quát được xử lý khi bấm nút Edit
        }

        public virtual void fncDelete()
        {
            //TODO: Các lệnh tổng quát được xử lý khi bấm nút Delete
            if (_IsAutoRefresh)
            {
                fncRefresh();
            }
        }

        public virtual void fncRefresh()
        {
            //TODO: Các lệnh tổng quát được xử lý khi bấm nút Refresh
        }

        public virtual void fncPrint()
        {
            //TODO: Các lệnh tổng quát được xử lý khi bấm nút Print Preview
        }

        public virtual void fncLoad()
        {
            //TODO: Các lệnh tổng quát được xử lý khi form được Load lên
        }

        public virtual void fncFind()
        {
            //TODO: Các lệnh tổng quát được xử lý khi bấm nút Find
        }

        public virtual void fncFilter(bool bitEnable)
        {
            //TODO: Các lệnh tổng quát được xử lý khi bấm nút Filter
        }

        public virtual void fncFilter(bool bitEnable, string strGridName)
        {
            //TODO: Các lệnh tổng quát được xử lý khi bấm nút Filter
        }

        public virtual void fncSumary(bool bitEnable)
        {
            //TODO: Các lệnh tổng quát được xử lý khi bấm nút Sumary
        }

        public virtual void fncSumary(bool bitEnable, string strGridName)
        {
            //TODO: Các lệnh tổng quát được xử lý khi bấm nút Sumary
        }

        public void Erp_ExceptionHandler(Exception ex)
        {
            //TODO: Handle Exception
            StatusText = ex.Message;
        }

        public string Erp_GetText(string strKey)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        public string Erp_GetText(string strKey, string strCulture)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        #endregion
    }
}
